package com.example.mysql_mybatis_demo.springsource.config;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * 自定义的 FactoryBean
 * 注意 FactoryBean需要声明为Bean，加入到Spring容器中
 */
@Component
public class FactoryBeanOneTest implements FactoryBean<NonBeanTest> {
    /**
     * getObject() 是 FactoryBean的核心方法，如果直接调用这个方法就是执行创建 Bean的流程。
     * 反正最终返回创建的Bean即可，因此在这里可以做很多复杂的工作
     * @return
     * @throws Exception
     */
    @Override
    public NonBeanTest getObject() throws Exception {
        System.out.println("调用NonBeanTest的1号Factory，设置其名称为 NonBean_One_SN");
        // 注意调用 Factory时，每次都会new一个新的类实例，但是到底是不是新的new呢？这就得看下面的isSingleton是单例还是共享了
        NonBeanTest nonBeanOne = new NonBeanTest();
        // 每次调用Factory实例化Bean时，给Bean赋一个随机值，用来验证是否单例
        nonBeanOne.setName("NonBean_One_" + UUID.randomUUID().toString().substring(0,5));
        return nonBeanOne;
    }

    @Override
    public Class<?> getObjectType() {
        return NonBeanTest.class;
    }

    /**
     * 规定为单例模式。则每次调用 FactoryBeanOneTest.getObject() 得到的都是同一个nonBeanOne，虽然在getObject()方法中使用了new
     * @return
     */
    @Override
    public boolean isSingleton() {
        return true;
    }
}
